<!DOCTYPE html>
<html>

  <head>
	<meta charset="UTF-8">
	<title>Xtext - Xtext 2.16.0 Release Notes</title>
	
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta name="description"
		content="The website of Eclipse Xtext, an open-source framework for development of programming languages and domain-specific languages">
	<meta name="author" content="Sven Efftinge">
	<meta name="author" content="Miro Spoenemann">
	<!--  styles -->
	<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
	<!--[if lt IE 9]>
	  <script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script>
	<![endif]-->
	
	<!-- Le fav and touch icons -->
	<link rel="shortcut icon" href="/Xtext/images/favicon.png">
	
	<link href="/Xtext/css/bootstrap.css" rel="stylesheet" type='text/css'>
	<link href="/Xtext/css/bootstrap-responsive.css" rel="stylesheet" type='text/css'>
	<link href="/Xtext/css/shield-responsive.css" rel="stylesheet" type='text/css'>
	<link href='/Xtext/css/fonts.css' rel='stylesheet' type='text/css'>
	<link href="/Xtext/css/prettyPhoto.css" rel="stylesheet" media="screen" type='text/css'>
	<link href="/Xtext/css/prettify.css" type="text/css" rel="stylesheet"/>
	<link href="/Xtext/css/style.css" rel="stylesheet" type='text/css'>
	<!-- cover flow -->
	<link href="/Xtext/css/coverflow.css" rel="stylesheet" type='text/css'>
	<!--[if lt IE 9]>
	  <link href="/css/iebugs.css" rel="stylesheet" type='text/css'>
	<![endif]-->

	<!-- BEGIN Cookie Consent
	<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css" />
	<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js"></script>
	<script>
	window.addEventListener("load", function(){
	window.cookieconsent.initialise({
		"palette": {
		"popup": {
		  "background": "#000"
		},
		"button": {
		  "background": "#f1d600"
		}
		},
		"theme": "edgeless",
		"type": "opt-in",
		onInitialise: function (status) {
		  var type = this.options.type;
		  var didConsent = this.hasConsented();
		  if (type == 'opt-in' && didConsent) {
		    // TODO: enable cookies
		  }
		  if (type == 'opt-out' && !didConsent) {
		    // TODO: disable cookies
		  }
		},
		onStatusChange: function(status, chosenBefore) {
		  var type = this.options.type;
		  var didConsent = this.hasConsented();
		  if (type == 'opt-in' && didConsent) {
		    // TODO: enable cookies
		  }
		  if (type == 'opt-out' && !didConsent) {
		    // TODO: disable cookies
		  }
		}, 
		onRevokeChoice: function() {
		  var type = this.options.type;
		  if (type == 'opt-in') {
		    // TODO: disable cookies
		  }
		  if (type == 'opt-out') {
		    // TODO: enable cookies
		  }
		},
		"content": {
		"href": "https://www.eclipse.org/legal/privacy.php"
		}
	})});
	</script>
	END Cookie Consent -->
</head>


  <body>
  
    <header class="site-header">

  <!-- Navbar -->
  <div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
      <div class="container">
        <a class="btn btn-navbar" data-toggle="collapse"
          data-target=".nav-collapse"> <span class="icon-bar"></span> <span
          class="icon-bar"></span> <span class="icon-bar"></span>
        </a> <a class="brand" href="/Xtext/index.html"></a>
        <div class="nav-collapse collapse" style="height: 0px;">
          <ul class="nav">
            <!--li ><a href="/Xtext/news.html">News</a></li-->
            <li ><a href="/Xtext/download.html">Download</a></li>
            <li ><a href="/Xtext/documentation/index.html">Documentation</a></li>
            <li ><a href="/Xtext/community.html">Community</a></li>
            <li class="dropdown">
              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Support &amp; Trainings<span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="https://info.itemis.com/professional-xtext-support" target="_blank">itemis</a></li>
                <li><a href="https://www.typefox.io/language-engineering/" target="_blank">TypeFox</a></li>
              </ul>
            </li>
            <li ><a href="https://eclipse.dev/Xtext/xtend">Xtend</a></li>
          </ul>
          <!--div class="nav pull-right">
            <li ><a><iframe src="https://ghbtns.com/github-btn.html?user=eclipse&repo=xtext&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px"></iframe></a></li>
          </div-->
        </div>
        <!--/.nav-collapse -->
      </div>
    </div>
  </div>
  <!-- Navbar End -->

</header>


    <div class="page-content">
  <div class="wrapper">
    <div id="page">  
    	<div class="inner">
    		<br/><br/>
    		<div id="maincontainer" class="container">
    			<div class="span8 offset1">
    				<h1>Xtext 2.16.0 Release Notes</h1>
    				<h4>Dec 4, 2018</h4>
    				<br/>
    				<p>This release focuses on stability, performance and the compatibility with Eclipse 2018-12.</p>

<h2 id="java-11-preparation">Java 11 preparation</h2>

<p>Java 11 has been released in September 2018 and <a href="https://github.com/eclipse-xtext/xtext/issues/1182">Xtext is in preparation</a> for full support. Xtext relies on plenty of different components, each of which need to work with Java 11. So far, not all of these are available themselves. Other parties have released new versions that could not be integrated yet. As a result we had to reschedule Java 11 support for Xtext 2.17. However, some preparational work has already been included into Xtext 2.16:</p>

<ul>
  <li>ASM 7: The ASM bytecode analysis and manipulation framework has been upgraded to the latest version 7.0.</li>
  <li>Tycho 1.3: Tycho 1.3 is built against latest JDT, which is required to use Java 11. All projects and wizards have been upgraded to Tycho 1.3.</li>
  <li>Gradle: Xtext 2.16 builds against and uses Gradle 4.10.2 now.</li>
</ul>

<h2 id="testing">Testing</h2>

<h3 id="quickfix-testing-api">Quickfix testing API</h3>

<p>A new base class <a href="https://github.com/eclipse-xtext/xtext/blob/main/org.eclipse.xtext.ui.testing/src/org/eclipse/xtext/ui/testing/AbstractQuickfixTest.java"><code>AbstractQuickfixTest</code></a> allows the definition of test cases for quickfixes. Quickfixes can be tested by using the method</p>

<pre><code class="language-java">public void testQuickfixesOn(CharSequence model, String issueCode, Quickfix... quickfixes)
</code></pre>

<p>This method takes the original DSL text as its first argument. The second argument is the issue code of the problem that can be fixed by the quickfixes under test. Finally the third argument is an array of <code>Quickfix</code> testing instances. A testable Quickfix defines a label, a description and the expected resulting DSL text.</p>

<pre><code class="language-xtend">	@Data
	protected static class Quickfix {
		String label
		String description
		String result
	}
</code></pre>

<p>The Xtext example projects Domainmodel, Statemachine and Home Automation do include exemplary tests to demonstrate its usage. The Domainmodel example’s quickfix test looks like this:</p>

<pre><code class="language-xtend">class QuickfixTest extends AbstractQuickfixTest {

	@Before
	def void setup() {
	}

	@Test
	def fix_invalid_entity_name() {
		'''
			entity blog {
			}
		'''.testQuickfixesOn(INVALID_TYPE_NAME, new Quickfix("Capitalize name", "Capitalize name  of 'blog'", '''
				entity Blog {
				}
			''')
		)
	}
	..
}}
</code></pre>

<h2 id="new-project-wizard">New Project Wizard</h2>

<ul>
  <li>The New Xtext Project wizard selects JUnit 5 as default now.</li>
  <li><em>Maven</em> build support:  the <code>maven-clean-plugin</code> configuration in the parent <code>pom.xml</code> has been fixed.</li>
  <li><em>Gradle</em> build support: Upgrade to Gradle wrapper 4.10.2.</li>
</ul>

<h2 id="xbase-library">Xbase Library</h2>

<p>The Xbase library supports now accessors for two-dimensional arrays.</p>

<h2 id="parallel-project-build-support">Parallel Project Build Support</h2>

<p>With Eclipse 4.8 (Photon) the Eclipse Platform is supporting parallel build of projects in the workspace. Enabling this feature requires that all configured builders of a project are defining a fine grained scheduling rule. For the XtextBuilder the scheduling rule is configurable by preference now.</p>

<p>The preference is not configurable through preference pages. To enable it, set the <code>org.eclipse.xtext.builder/schedulingrule</code> preference option programmatically or by providing a preference file. The supported values are:</p>

<ul>
  <li><code>WORKSPACE</code>:  Workspace root scheduling. This is the default value.</li>
  <li><code>ALL_XTEXT_PROJECTS</code>: Lock all projects with Xtext nature configured. Allows projects of other natures to be built in parallel.</li>
  <li><code>PROJECT</code>: Locks the currently built project.</li>
  <li><code>NULL</code>: No locking</li>
</ul>

<p>This feature is <em>experimental</em> for now.</p>

<h2 id="language-server-support">Language Server Support</h2>

<h3 id="upgrade-to-eclipse-lsp4j-060">Upgrade to Eclipse LSP4J 0.6.0</h3>

<p>Xtext 2.16 integrates Eclipse LSP4J version 0.6.0.</p>

<h3 id="hierarchical-document-symbols">Hierarchical Document Symbols</h3>

<p>Xtext now supports the <em>hierarchical document symbols</em> as a response to the <code>textDocument/documentSymbol</code> request (introduced in <a href="https://microsoft.github.io/language-server-protocol/specification#version_3_10_0">LSP 3.10.0</a>). For this support a new interface <a href="https://github.com/eclipse-xtext/xtext/blob/main/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/IDocumentSymbolService.xtend"><code>IDocumentSymbolService</code></a> has been added to the bundle <code>org.eclipse.xtext.ide</code>. By default it binds to a no-op implementation. Hierarchical symbols can be activated by binding the interface to the <a href="https://github.com/eclipse-xtext/xtext/blob/main/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/HierarchicalDocumentSymbolService.xtend"><code>HierarchicalDocumentSymbolService</code></a> implementation.</p>

<h3 id="configurable-server-exit-behavior">Configurable Server Exit Behavior</h3>

<p>The default behavior on receiving the <code>exit</code> command of Xtext language servers was to call <code>System.exit</code> and thus terminate the JVM. While this is desirable when a host process is shut down (like termination of the editing tool), it harms <a href="https://github.com/eclipse/xtext-core/issues/885">scenarios</a> where the language server and client run on the same JVM.</p>

<p>To support both use cases, the <code>exit</code> command is now delegated to the <code>ILanguageServerShutdownAndExitHandler</code>. Its default implementation <code>ILanguageServerShutdownAndExitHandler.DefaultImpl</code> preserves the existing behavior and invokes <code>System.exit()</code>. For embedded scenarios, the interface can be bound to <code>ILanguageServerShutdownAndExitHandler.NullImpl</code> instead, which ignores the exit request and keeps the JVM alive.</p>

<h2 id="minimal-target-platform">Minimal Target Platform</h2>

<p>The Eclipse Platform has changed the release cadence after its Photon release (4.9) to quartely major releases. This increases the speed of changes to the platform that Xtext relies on. Since Xtext integrates deeply with the platform, its becoming harder to to support a wide range of releases. Therefore we decided to cut off the supported Eclipse releases and require at least Eclipse 4.7.3a (Oxygen.3a, latest Oxygen release).</p>

<p>This has now been enforced by constraining the lower bound of all bundles of the Eclipse Platform. As a consequence, Xtext 2.16 can no longer be installed on an older Eclipse release.</p>

<h2 id="deprecation-of-gwt">Deprecation of GWT</h2>

<p>We will no longer maintain the GWT versions of Xbase and Xtend Lib. The corresponding jars will be no longer published with future versions of Xtext (likely from 2.17 on).</p>

<h2 id="outlook-for-217">Outlook for 2.17</h2>

<p>Java 11 Support, a Maven BOM and a new MWE version are planned for 2.17</p>

<h2 id="fixed-issues">Fixed Issues</h2>

<p>As in every release cycle we were eagerly hunting down bugs, and reviewed and integrated plenty of contributions. Almost 100 issues and 300 pull requests have made it into this release. For further details please refer to the following lists:</p>

<ul>
  <li>
    <p><a href="https://github.com/search?utf8=%E2%9C%93&amp;q=is%3Aissue+milestone%3ARelease_2.16+is%3Aclosed+repo%3Aeclipse%2Fxtext+repo%3Aeclipse%2Fxtext-core+repo%3Aeclipse%2Fxtext-lib+repo%3Aeclipse%2Fxtext-extras+repo%3Aeclipse%2Fxtext-eclipse+repo%3Aeclipse%2Fxtext-idea+repo%3Aeclipse%2Fxtext-web+repo%3Aeclipse%2Fxtext-maven+repo%3Aeclipse%2Fxtext-xtend&amp;type=Issues&amp;ref=searchresults">Fixed GitHub issues</a></p>
  </li>
  <li>
    <p><a href="https://github.com/search?utf8=%E2%9C%93&amp;q=is%3Apr+milestone%3ARelease_2.16+is%3Aclosed+repo%3Aeclipse%2Fxtext+repo%3Aeclipse%2Fxtext-core+repo%3Aeclipse%2Fxtext-lib+repo%3Aeclipse%2Fxtext-extras+repo%3Aeclipse%2Fxtext-eclipse+repo%3Aeclipse%2Fxtext-idea+repo%3Aeclipse%2Fxtext-web+repo%3Aeclipse%2Fxtext-maven+repo%3Aeclipse%2Fxtext-xtend&amp;type=Issues&amp;ref=searchresults">Closed Pull Requests</a></p>
  </li>
  <li>
    <p><a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&amp;bug_status=VERIFIED&amp;bug_status=CLOSED&amp;classification=Modeling&amp;classification=Tools&amp;columnlist=product%2Ccomponent%2Cassigned_to%2Cbug_status%2Cresolution%2Cshort_desc%2Cchangeddate%2Ckeywords&amp;f0=OP&amp;f1=OP&amp;f3=CP&amp;f4=CP&amp;known_name=Xtext%202.16&amp;list_id=16618269&amp;product=TMF&amp;product=Xtend&amp;query_based_on=Xtext%202.16&amp;query_format=advanced&amp;status_whiteboard=v2.16&amp;status_whiteboard_type=allwordssubstr">Fixed Eclipse Bugzilla tickets</a></p>
  </li>
</ul>

    			</div>
    		</div>
      </div>
    </div>
  </div>
</div>
    
    <footer class="site-footer">
  <div id="extra">
    <div class="inner">
      <div class="container">
        <div class="row">
          <div class="span6">
            <h3 class="footer-links-header">Quick Links</h3>
            <ul class="footer-links clearfix">
              <li><a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
              <li><a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
              <li><a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
              <li><a href="https://www.eclipse.org/legal/">Legal</a></li>
            </ul>
            <ul class="footer-links clearfix">
              <li><a href="https://www.eclipse.org">Eclipse Home</a></li>
              <li><a href="https://marketplace.eclipse.org/">Market Place</a></li>
              <li><a href="https://www.planeteclipse.org/">Eclipse Planet</a></li>
              <li><a href="https://www.eclipse.org/forums/index.php/f/27/">Xtext Forum</a></li>
            </ul>
            <br/><br/>
            Xtext is a trademark of the Eclipse Foundation, Inc. and is used with permission
            <br/><br/>
            <img src="/Xtext/images/eclipse-foundation-white-orange.svg" alt="Eclipse Foundation"/>
          </div>
          <div class="span6">
            <!-- Social Media Links -->
            <h3 class="footer-links-header">Social Media</h3>
            <ul class="footer-links clearfix">
              <li>
                <a href="https://twitter.com/xtext"><img src="/Xtext/images/Twitter-bird-darkgray.png" class="img-responsive" style="margin-right: 5px;height: 1em;" alt="Twitter icon">@xtext on Twitter</a>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>
  <a href="#" class="scrollup fadeOutRight animated" style="display: none;">ScrollUp</a>
  <!-- Le javascript
      ================================================== -->
  <!-- Placed at the end of the document so the pages load faster -->
  
  <script src="/Xtext/js/jquery-1.11.3.min.js"></script>
  <script src="/Xtext/js/bootstrap.min.js"></script>
  <script src="/Xtext/js/jquery.easing.1.3.js" type="text/javascript"></script>
  <script src="/Xtext/js/jquery.prettyPhoto.js" type="text/javascript"></script>
  <script src="/Xtext/js/prettify.js" type="text/javascript"></script>
  <script src="/Xtext/js/lang-xtend.js" type="text/javascript"></script>
  <script src="/Xtext/js/lang-common.js" type="text/javascript"></script>
  <script src="/Xtext/js/custom.js" type="text/javascript"></script>
  <!--script src="https://apis.google.com/js/platform.js" async defer></script-->
  <!--script type="text/javascript">
    var _gaq = _gaq || [];  
      _gaq.push([ '_setAccount', 'UA-2429174-3' ]);
    _gaq.push([ '_trackPageview' ]);
    (function() {
      var ga = document.createElement('script');
      ga.type = 'text/javascript';
      ga.async = true;
      ga.src = ('https:' == document.location.protocol ? 'https://ssl'
          : 'https://www')
          + '.google-analytics.com/ga.js';
      var s = document.getElementsByTagName('script')[0];
      s.parentNode.insertBefore(ga, s);
    })();
  </script-->
  <script src="/Xtext/js/coverflow.min.js" type="text/javascript"></script>
  <script>
      $(function() {
        $('#coverflow').coverflow({
          active : 1,
          visibleAside: 2,
          overlap : 0.5,
          scale : 0.9,
          angle : 20,
          trigger : {
            "itemfocus" : true,
            "swipe" : true,
            "mousewheel" : false
          }
        });
        $('#coverflow :hidden').toggle();
        $(window).resize(function() {
          $('#coverflow').coverflow();
        });
      });

  </script>
</footer>


  </body>

</html>
